<?php

class coreSession
{
    // 자신의 인스턴스
    public static $instance;
    // 쿠키명
    protected $CODE = SC_COOKIE_CODE;
    // 쿠키 데이터가 파싱되어 저장됨
    protected $SESSDATA = array();

    protected $param1;
    protected $param2;

    public function __construct($param1, $param2)
    {
        $this->param1 = $param1;
        $this->param2 = $param2;
    }

    public static function session_start($param1 = '', $params2 = '')
    {
        if (!self::$instance) self::$instance = new commSession($param1, $param2);

        self::$instance->start();
    }

    public function start()
    {
        $this->CODE = $this->getSessionName();
        $_COOKIE[$this->CODE] = empty($_COOKIE[$this->CODE]) ? null : $_COOKIE[$this->CODE];
        $this->SESSDATA = $this->parserCookie($_COOKIE[$this->CODE]);
        $_SESSION = $this->SESSDATA;

        // 세션 경과 시간 확인
        $this->expireTimeCheck();

        $this->initSession();
    }

    protected function initSession()
    {
        if (empty($_SESSION['sess_id'])) {
            $_SESSION['sess_id'] = md5(microtime().$_SERVER['REMOTE_ADDR']);
            $_SESSION['ip'] = $this->getRealIpAddr();
        }

        $_SESSION['unix_time'] = time();
    }

    /**
     *
     * 세션 이름을 리턴
     * 오버라이딩해서 세션이 저장될 쿠키명을 변경할 수 있음.
     * @return string
     */
    public function getSessionName()
    {
        return SC_COOKIE_CODE;
    }

    private function parserCookie($sCook)
    {
        $_sCook = utilDes::decrypt(rawurldecode($sCook));
        parse_str($_sCook, $aCook);

        return $aCook;
    }

    /**
     *
     * 해당 시간이 경과 할 경우 센션을 초기화 한다.
     */
    protected function expireTimeCheck()
    {
        if (empty($_SESSION['unix_time']) === true) return false;

        if (($_SESSION['unix_time'] + SC_SESSION_TIME) < time()) {
            $_SESSION = array();
        }
    }

    /**
     *
     * 클라이언트 리얼 아이피 조회
     */
    protected function getRealIpAddr()
    {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
            return $_SERVER['HTTP_CLIENT_IP'];

        } else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            return $_SERVER['HTTP_X_FORWARDED_FOR'];

        } else {
            return $_SERVER['REMOTE_ADDR'];
        }
    }

    /**
     *
     * 쿠키 저장
     */
    public static function register()
    {
        self::$instance->setcookie();
    }

    private function setcookie()
    {
        $utilCookie = new utilCookie();
        $utilCookie->setcookie($this->CODE, rawurlencode(utilDes::encrypt($this->buildCookieString($_SESSION))), 0, true);
    }

    private function buildCookieString($aCook)
    {
        //return (empty($aCook) === false) ? http_build_query($aCook, '', '&') : '';
        return http_build_query($aCook, '', '&');
    }

    /**
     *
     * 해당 SESSION 등록
     * @param string $name
     * @param string $value
     */
    public static function session_register($name, $value)
    {
        $_SESSION[$name] = $value;
    }

    /**
     *
     * 해당 SESSION 삭제
     * @param string $name
     */
    public static function session_unregister($name)
    {
        unset($_SESSION[$name]);
    }

    /**
     *
     * 해당 SESSION 데이터 조회
     * @param string $name
     */
    public static function session_get_data($name)
    {
        return empty($_SESSION[$name]) ?  false : $_SESSION[$name];
    }

    /**
     *
     * 해당 SESSION 저장 여부 확인
     * @param string $name
     */
    public static function session_is_registered($name)
    {
        return isset($_SESSION[$name]);
    }

    /**
     *
     * SESSION 초기화
     */
    public static function session_destroy()
    {
        unset($_SESSION);
        commSession::register();
    }
}
